package com.crm.service.returnMoney;

import com.crm.model.dto.SalesmanDto;
import com.crm.model.entity.returnMoney.ReturnMoney;
import com.crm.model.qo.productManager.AnalyseReturnMoneyProductQO;
import com.crm.model.qo.returnMoney.ReturnMoneyQO;
import com.crm.model.vo.customerManager.CustomerOrderBackMoneyVO;
import com.crm.model.vo.orderManager.PerformanceRankVO;
import com.crm.model.vo.productManager.AnalyseReturnMoneyProductVO;
import com.crm.model.vo.productManager.PerformanceAnalysisVO;
import com.crm.model.vo.returnMoney.FinancialDetailsVO;
import com.crm.model.vo.returnMoney.PerformanceDetailsVO;
import com.crm.model.vo.returnMoney.ReturnMoneyVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface ReturnMoneyDbservice {
    List<ReturnMoneyVO> selectCustomerProductList(ReturnMoneyQO returnMoneyQO, String order,Integer dateUnit);

    /**
     * 录入回款
     * @param returnMoney
     */
    boolean addReturnMoney(ReturnMoney returnMoney);

    /**
     * 根据合同查询回款次数
     * @param contractId
     * @return
     */
    Integer getReturnMoneyNum(String contractId);

    /**
     * 获取总公司
     */
    String getArriveHQCompName();

    /**
     * 修改回款信息
     * @param returnMoney
     */
    void updateReturnMoney(ReturnMoney returnMoney);

    /**
     * 根据id查询回款信息
     * @param returnMoneyId
     * @return
     */
    ReturnMoneyVO getReturnMoenyInfoById(String returnMoneyId);

    /**
     * 根据订单id修改订单信息
     * @param returnMoney
     */
    void updateReturnMoneyByOrderId(ReturnMoney returnMoney);

    /**
     * 根据合同ID修改回款表的合同类型
     * @param returnMoney
     * @author yincuimei
     * @return
     */
    Boolean updateReturnMoneyByContractId(ReturnMoney returnMoney);

    /**
     * 根据合同id获取回款记录
     * @param contractId
     * @return
     */
    List<ReturnMoney> selectReturnMoneyByContractId(String contractId);

    /**
     * 根据订单id查询最后一次回款信息
     * @param productOrderId
     */
    ReturnMoneyVO selectFinallyReturnMoneyByOrderId(String productOrderId);

    /**
     * 删除回款记录
     * @param returnMoneyId
     * @return
     */
    Integer delReturnMoney(String returnMoneyId,String accountId);

    /**
     * 根据回款编号查询
     * @param arriveNum
     * @return
     */
    ReturnMoneyVO selectReturnMoneyByNumber(String arriveNum);

    /**
     * 分公司财务统计回款列表
     * @param returnMoneyQO
     * @return
     */
    List<ReturnMoneyVO> selectStatReturnMoney(ReturnMoneyQO returnMoneyQO,Integer dateUnit);

    /**
     * 总部财务统计回款列表
     * @param returnMoneyQO
     * @param dateUnit
     * @return
     */
    List<ReturnMoneyVO> selectSuperStatReturnMoney(ReturnMoneyQO returnMoneyQO, Integer dateUnit);

    /**
     * 分公司财务统计回款列表
     * @param returnMoneyQO
     * @param dateUnit
     * @return
     */
    List<ReturnMoneyVO> selectStatBackMoney(ReturnMoneyQO returnMoneyQO, Integer dateUnit);

    /**
     * 总部财务统计回款列表
     * @param returnMoneyQO
     * @param dateUnit
     * @return
     */
    List<ReturnMoneyVO> selectSuperStatBackMoney(ReturnMoneyQO returnMoneyQO, Integer dateUnit);

    /**
     * 通过订单id查询退款记录
     * @param orderId
     * @return
     */
    List<ReturnMoneyVO> selectReturnMoneyByOrderIdAndMoney(String orderId);

    /**
     * 根据订单编号查询导入的回款数据
     * @param orderId
     * @return
     */
    ReturnMoneyVO selectImportReturnMoneyByOrderId(String orderId);

    /**
     * 查询已完成的退款统计信息
     * @param returnMoneyQO
     * @param dateUnit  1本周 2本月 3本年 4昨天 5今天
     * @return
     */
    List<CustomerOrderBackMoneyVO> selectDoneOrderBackMoney(ReturnMoneyQO returnMoneyQO, Integer dateUnit);

    /**
     * 查询部分回款退款统计信息
     * @param returnMoneyQO
     * @param dateUnit  1本周 2本月 3本年 4昨天 5今天
     * @return
     */
    List<CustomerOrderBackMoneyVO> selectPartOrderBackMoney(ReturnMoneyQO returnMoneyQO, Integer dateUnit);

    /**
     * 通过订单id查询回款记录
     * @param productOrderId 订单id
     * @return
     */
    List<ReturnMoneyVO> selectOrderId(String productOrderId);

    /**
     * 查询订单最后回款时间
     * @param productOrderId
     */
    Date selectOrderMaxArriveTime(String productOrderId);

    List<ReturnMoneyVO> testReturnMoenyList();

    /**
     * 计算回款金额
     * @param companyId
     * @param dateUnit
     * @return
     */
    BigDecimal selectReturnMoneyCount(String companyId, Integer dateUnit);

    /**
     * 计算退款金额
     * @param companyId
     * @param dateUnit
     * @return
     */
    BigDecimal selectBackMoneyCount(String companyId, Integer dateUnit);

    /**
     * 取最近一条的到款时间
     * @param productOrderId 订单id
     * @return
     */
    ReturnMoneyVO selectReturnMoneyByOrderId(String productOrderId);

    /**
     * 根据id查询
     * @param returnMoneyId
     * @return
     */
    ReturnMoneyVO selectReturnMoneyById(String returnMoneyId);

    /**
     * 查询订单产品回款情况
     * @param finishOrderProductId
     * @return
     */
    BigDecimal selectOrderProductReturnMoneyCount(String finishOrderProductId,String orderId);

    /**
     * 通过产品号查询回款记录
     * @param finishOrderProductNum
     * @return
     */
    List<ReturnMoney> selectFinishOrderProductNum(String finishOrderProductNum);

    /**
     * 通过订单id查询回款记录
     * @param productOrderId 订单id
     * @return
     */
    List<ReturnMoney> selectMoneyByOrderId(String productOrderId);

    void delFinishByOrderId(String productOrderId);

    BigDecimal selectReturnMoneyCountByOrderId(String orderId);

    /**
     * 根据退款时间更新到款时间
     * @return
     */
    List<ReturnMoney> selectUpdateReturnTime();

    /**
     * 删除订单下的所有回款记录
     * @param accountId
     */
    void delReturnMoneyByOrderId(String productOrderId,String accountId);

    /**
     * 根据主键Id修改提成发放状态
     * @Author pym
     * @Date  2021/9/24 10:10
     * @param returnMoneyId 回款记录表主键
     * @param royaltyStatus 提成发放状态
     * @param accountId 更新人
     * @param updateTm 更新时间
     * @return {@link {java.lang.Boolean}}
     */
    Boolean updateRoyaltyStatusByReturnMoneyId(List<String> returnMoneyId, int royaltyStatus, String accountId, Date updateTm);


    List<ReturnMoney> selectReturnMoneyNoCustomer(String companyId);

    /**
     * 批量补充回款表客户信息(临时用补充正式库数据:customer_id;customer_name为空的)
     * @param returnMoneyList
     * @author yincuimei
     * @Date(2021-9-26)
     * @return
     */
    Boolean batchUpdateReturnMoneyByOrderNumber(List<ReturnMoney> returnMoneyList);
    /**
     * 通过订单id和产品号查询回款信息
     * @param productOrderId 订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<ReturnMoney> selectMoneyByOrderIdAndFinshNum(String productOrderId, String finishOrderProductNum);

    /**
     * 财务明细
     * @return
     */
    List<FinancialDetailsVO> selectFinancialDetails(ReturnMoneyQO returnMoneyQO);

    /**
     * 业绩明细
     * @return
     */
    List<PerformanceDetailsVO> selectPerformanceDetails(ReturnMoneyQO returnMoneyQO);

    /**
     * 按照月份统计个人的业绩金额
     * @param returnMoneyQO
     * @return
     */
    BigDecimal sumCustomerPay(ReturnMoneyQO returnMoneyQO);

    /**
     * 按照月份统计个人的returnMoney金额
     * @param returnMoneyQO
     * @return
     */
    BigDecimal sumReturnScoreMoney(ReturnMoneyQO returnMoneyQO);

    /**
     * 报表统计 - 业绩分析 - 销售产品分析
     * @Author pym
     * @Date  2021/9/27 14:48
     * @param analyseReturnMoneyProductQO -查询条件
     * @param order - 排序
     * @param accountId - 账号Id
     * @return {@link {java.util.List<com.crm.model.vo.productManager.AnalyseReturnMoneyProductVO>}}
     */
    List<AnalyseReturnMoneyProductVO> selectReturnMoneyProductList(AnalyseReturnMoneyProductQO analyseReturnMoneyProductQO, String order, String accountId);

    /**
     * 会员产品数量和销售额度
     * @Author pym
     * @Date  2021/10/21 10:02
     * @param accountId 账号Id
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return {@link {com.crm.model.vo.productManager.PerformanceAnalysisVO}}
     */
    PerformanceAnalysisVO selectMemberProductCountAndPrice(String accountId, String startDate, String endDate);

    /**
     * 非会员产品数量和销售额度
     * @Author pym
     * @Date  2021/10/21 10:03
     * @param accountId 账号Id
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return {@link {com.crm.model.vo.productManager.PerformanceAnalysisVO}}
     */
    PerformanceAnalysisVO selectNonMemberProductCountAndPrice(String accountId, String startDate, String endDate);

    /**
     * 年度会员产品数量和销售额度
     * @Author pym
     * @Date  2021/10/21 10:04
     * @param accountId 账号Id
     * @param year 年份
     * @return {@link {java.util.List<com.crm.model.vo.productManager.PerformanceAnalysisVO>}}
     */
    List<PerformanceAnalysisVO> selectYearMemberProductCountAndPrice(String accountId, Date year);

    /**
     * 年度非会员产品数量和销售额度
     * @Author pym
     * @Date  2021/10/21 10:04
     * @param accountId 账号Id
     * @param year 年份
     * @return {@link {java.util.List<com.crm.model.vo.productManager.PerformanceAnalysisVO>}}
     */
    List<PerformanceAnalysisVO> selectYearNonMemberProductCountAndPrice(String accountId, Date year);

    /**
     * 通过finish查询回款信息
     * @param finishId
     * @return
     */
    List<ReturnMoneyVO> selectReturnMoneyByFinishId(String finishId);

    /**
     * 查询订单的附加费用回款金额
     * @param productOrderId
     * @return
     */
    BigDecimal selectOrderSurchargeCount(String productOrderId);

    /**
     * 通过产品号查询回款记录
     * @param finishOrderProductNum 产品号
     * @return
     */
    ReturnMoney selectReturnMoneyByFinishNum(String finishOrderProductNum);

    /**
     * 双十一报表
     * @param entryArea
     * @param month
     * @return
     */
    List<PerformanceRankVO> reportForNovember(String entryArea,String year, String month,String day);

    /**
     * 根据订单id查询最后一次回款时间
     * @Param orderId
     * @Param orderBy
     * @Author xielinqi
     * @Date 2:16 下午 2021/11/8
     */
    ReturnMoney selectLastByOrderId(String orderId, String orderBy);

    /**
     * 根据产品号查询最后一次回款时间
     * @Param finishOrderProductNum
     * @Author xielinqi
     * @Date 2:18 下午 2021/11/8
     */
    ReturnMoney selectLastByFinishOrderProductNum(String finishOrderProductNum);

    /**
     * 根据订单id查询一条未封账的回款记录
     * @Param productOrderId
     * @Author xielinqi
     * @Date 4:39 下午 2021/11/9
     */
    ReturnMoney getNoCloseOne(String productOrderId);

    /**
     * 根据订单id查询一条封账的回款记录
     * @Param productOrderId
     * @Author xielinqi
     * @Date 5:44 下午 2021/11/9
     */
    ReturnMoney getCloseOne(String productOrderId);

    /**
     *
     * @Param orderId
     * @Author xielinqi
     * @Date 9:29 上午 2021/11/19
     */
    List<ReturnMoneyVO> selectListByOrderId(String orderId);

    /**
     * 统计业务员每月的业绩
     */
    List<SalesmanDto> getSalesmanResultsByMonth();

    /**
     * 查询所有业务员年业绩
     * @return
     */
    List<SalesmanDto> getSalesmanResultsByYear();

    /**
     * 查询预回款金额
     * @param orderId
     * @param finishOrderProductNum
     * @return
     */
    BigDecimal queryPreReturnMoneyTotal(String orderId,String finishOrderProductNum);

    /**
     * 查询产品回款金额含预回款
     * @param finishOrderProductNum
     * @return
     */
    BigDecimal selectOrderProductReturnMoneyAllCount(String finishOrderProductNum,String orderId);
}
